package com.easychat.utils;
import com.easychat.constants.Constants;
import com.easychat.entity.enums.UserTypeEnum;
import com.easychat.exception.BusinessException;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;


public class StringTools {

    public static void checkParam(Object param) {
        try {
            Field[] fields = param.getClass().getDeclaredFields();
            boolean notEmpty = false;
            for (Field field : fields) {
                String methodName = "get" + StringTools.upperCaseFirstLetter(field.getName());
                Method method = param.getClass().getMethod(methodName);
                Object object = method.invoke(param);
                if (object != null && object instanceof java.lang.String && !StringTools.isEmpty(object.toString())
                        || object != null && !(object instanceof java.lang.String)) {
                    notEmpty = true;
                    break;
                }
            }
            if (!notEmpty) {
                throw new BusinessException("多参数更新，删除，必须有非空条件");
            }
        } catch (BusinessException e) {
            throw e;
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException("校验参数是否为空失败");
        }
    }

    public static String upperCaseFirstLetter(String field) {
        if (isEmpty(field)) {
            return field;
        }
        //如果第二个字母是大写，第一个字母不大写
        if (field.length() > 1 && Character.isUpperCase(field.charAt(1))) {
            return field;
        }
        return field.substring(0, 1).toUpperCase() + field.substring(1);
    }

    public static boolean isEmpty(String str) {
        if (null == str || "".equals(str) || "null".equals(str) || "\u0000".equals(str)) {
            return true;
        } else if ("".equals(str.trim())) {
            return true;
        }
        return false;
    }

    /**
     * 随机生成用户ID
     * @return
     */
    public static String getUserId() {
        //userId共12位，"U" + 11位随机序列 ”U“开头代表用户ID
        return UserTypeEnum.USER.getPrefix() + getRandomNumber(Constants.LENGTH_11);//11位，不带字母
    }

    /**
     * 随机生成群ID
     * @return
     */
    public static String getGroupId() {
        //groupId共12位，"G" + 11位随机序列 ”G“开头代表群ID
        return UserTypeEnum.GROUP.getPrefix() + getRandomNumber(Constants.LENGTH_11);
    }

    /**
     * 生成不带字母的随机序列
     * @param length 长度
     * @return
     */
    public static String getRandomNumber(Integer length) {
        return RandomStringUtils.random(length, false, true);
    }
    /**
     * 生成带字母的随机序列
     * @param length 长度
     * @return
     */
    public static String getRandomString(Integer length) {
        return RandomStringUtils.random(length, true, true);
    }

    /**
     * MD5加密
     * @param originStr
     * @return
     */
    public static String encodeMD5(String originStr) {
        if (originStr == null) {
            return null;
        }
        return DigestUtils.md5Hex(originStr);
    }

    /**
     * 防止html注入
     * @param content
     * @return
     */
    public static String cleanHtmlTag(String content) {
        if (isEmpty(content)) {
            return content;
        }
        content = content.replace("<", "&lt;");
        content = content.replace("\r\n", "<br>");
        content = content.replace("\n", "<br>");
        return content;
    }

    /**
     * 对于固定的两个用户，返回固定的sessionId
     * @param userIds
     * @return
     */
    public static String getChatSessionId4User(String[] userIds) {
        Arrays.sort(userIds);
        //将两个userId拼接起来，再md5加密
        String sessionId = encodeMD5(StringUtils.join(userIds, ""));
        return sessionId;
    }

    /**
     * 生成群组会话的sessionId
     * MD5算法具有确定性，即对于相同的输入数据，每次计算得到的MD5值都是一样的。
     * 这是因为MD5算法的输出是固定的，不会因为多次计算而改变‌
     * @param groupId
     * @return
     */
    public static String getChatSessionId4Group(String groupId) {
        return encodeMD5(groupId);
    }

    /**
     * 获取文件后缀 xxx.png -> .png
     * @param fileName 文件名
     * @return
     */
    public static String getFileExtension(String fileName) {
        if (isEmpty(fileName)) {
            return null;
        }
        return fileName.substring(fileName.lastIndexOf("."));
    }

    /**
     * 判断字符串是否全部由数字组成
     * @param str
     * @return
     */
    public static boolean isNumber(String str) {
        if (str == null) {
            return false;
        }
        if (!str.matches("^[0-9]+$")) {
            return false;
        }
        return true;
    }
}
